被离职前同事的代码坑惨了。。。
The following article is from 小夕学算法 Author 小夕
作者| 小夕
class HostObejct{
String productName;
String appName;
String 其它信息;
}
第一次请求的时候 代码初次执行
代码刚开始执行的时候:
会 new 一个对象
HostObejct hostObejct = new HostObejct().
然后根据用户传入的key值去查 redis 缓存里面的内容。
redis缓存里面没查到这key
如果使用这个key值没查到对应的 redis 缓存里面的内容
根据key值去查数据库记录查到了
那么会根据key值去数据库里面查到对应的需要记录,并把记录写入到redis缓存里面。
这样下次可以直接从缓存中去拿。
根据key值去查数据库记录没查到
这个时候就有意思了,这代码写得贼坑。
给小夕坑惨了。。。
它也会写入到缓存中,key是一样的,
但是value的话,写入的是 刚开始创建的对象
HostObejct hostObejct = new HostObejct().
由于这个对象里面没有进行赋值,所以 productName 是 null
后续同样的接口访问过来
根据这个 key 去查 redis 缓存
按照小夕刚才说的思路,由于redis缓存里面存了一个刚new的对象,
所以value不是空的。
这个时候会判断这个 value 对象里面的 productName 是不是空的,如果是空的话, 说明没有对应的产品线信息,那么就会抛出异常,下面继续从库里面查询的逻辑就无法执行了。。。
导致本身可以通过数据库查到的逻辑,无法执行到了。。。
难受、、、
小夕画了几张图
整体代码的流程图
第一次访问如果redis里面没查到
可以看到给redis里面写了一个productName 为null的对象
第二次同样的请求过来的流程图
可以看到直接就抛异常了。。。
这里明显不对,因为数据库里面是有记录的,必须让用户能查到数据才对。。。
正确的逻辑流程图
解决问题
小夕给擦了屁股,修了bug。
当从数据库没查到对应的记录的时候,就不去redis里面写数据了。。。
太难了。。。
<END>
程序员专属T恤
推荐阅读: